home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / x / xwaisq.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  14KB  |  480 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.
  4.  
  5.    This is part of the X user-interface for the WAIS software.  Do with it
  6.    as you please.
  7.  
  8.    jonathan@Think.COM
  9.  *
  10.  * $Log:    xwaisq.c,v $
  11.  * Revision 1.20  92/04/28  15:34:58  jonathan
  12.  * Cleaned up includes.  Replaced references to directory routines with
  13.  * scandir.
  14.  * 
  15.  * Revision 1.19  92/03/23  16:11:30  jonathan
  16.  * Added stuff to set button sensitivity.
  17.  * 
  18.  * Revision 1.18  92/03/17  15:08:23  jonathan
  19.  * Typed ExitCommand.
  20.  * 
  21.  * Revision 1.17  92/03/17  14:22:32  jonathan
  22.  * Generally cleaned up.
  23.  * 
  24.  * Revision 1.16  92/03/07  19:39:23  jonathan
  25.  * Fixed argument to ScanDirs.
  26.  * 
  27.  * Revision 1.15  92/03/06  15:01:51  jonathan
  28.  * Moved freopen to right before main loop.
  29.  * 
  30.  * Revision 1.14  92/03/06  14:49:19  jonathan
  31.  * New and Improved source loading!  Also rescans source directory if it
  32.  * changes.
  33.  * 
  34.  * Revision 1.13  92/03/01  14:04:06  jonathan
  35.  * Added command_name to main.
  36.  * 
  37.  */
  38.  
  39. #ifndef lint
  40. static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/x/RCS/xwaisq.c,v 1.20 92/04/28 15:34:58 jonathan Exp $";
  41. #endif
  42.  
  43. #define XWAISQ_C
  44. #define MAIN
  45. #include "xwais.h"
  46.  
  47. #define offset(field) XtOffset(struct _app_resources*, field)
  48. static XtResource resources[] = {
  49.    {"questionDirectory", "QuestionDirectory", XtRString, sizeof(char *),
  50.          offset(questionDirectory), XtRString, "~/wais-questions/"},
  51.    {"userSourceDirectory", "UserSourceDirectory", XtRString, sizeof(char *),
  52.          offset(userSourceDirectory), XtRString, "~/wais-sources/"},
  53.    {"commonSourceDirectory", "CommonSourceDirectory", XtRString, sizeof(char *),
  54.          offset(commonSourceDirectory), XtRString, ""},
  55.    {"documentDirectory", "DocumentDirectory", XtRString, sizeof(char *),
  56.          offset(documentDirectory), XtRString, "~/wais-documents/"},
  57.    {"helpFile", "HelpFile", XtRString, sizeof(char *),
  58.          offset(helpFile), XtRString, "./XwaisHELP"},
  59.    {"removeSeekerCodes", "RemoveSeekerCodes", XtRString, sizeof(char *),
  60.       offset(removeSeekerCodes), XtRString, "On"},
  61.    {"rescanInterval", "RescanInterval", XtRString, sizeof(char *),
  62.       offset(rescanInterval), XtRString, "1"},
  63.    {"seedWords", "SeedWords", XtRString, sizeof(char *),
  64.       offset(seedWords), XtRString, ""},
  65.    {"initialSource", "InitialSource", XtRString, sizeof(char *),
  66.       offset(initialSource), XtRString, ""},
  67.    {"questionName", "QuestionName", XtRString, sizeof(char *),
  68.       offset(questionName), XtRString, ""},
  69.    {"filters", "Filters", XtRString, sizeof(char *),
  70.       offset(filters), XtRString, ""},
  71.    {"maximumResults", "MaximumResults", XtRInt, sizeof(int),
  72.       offset(maximumResults), XtRImmediate, (caddr_t) 40},
  73.    {"doSearch", "DoSearch", XtRBoolean, sizeof(Boolean),
  74.       offset(doSearch), XtRBoolean, False},
  75.    {"defaultsInstalled", "DefaultsInstalled",  XtRBoolean, sizeof(Boolean),
  76.       offset(defaultsInstalled), XtRBoolean, False},
  77.    {"showKeys", "ShowKeys",  XtRBoolean, sizeof(Boolean),
  78.       offset(showKeys), XtRBoolean, False}
  79. };
  80. #undef offset
  81.  
  82. XtActionsRec xwaisActionsTable[] = {
  83.   /* special for return only */
  84.   {(String)"waissearch", (XtActionProc)DoSearch},
  85.   {(String)"save", (XtActionProc)DoSave},
  86.   {(String)"quit", (XtActionProc)DontSave},
  87.   {(String)"tsave", (XtActionProc)DoTSave},
  88.   {(String)"setdir", (XtActionProc)SetDir},
  89.   NULL
  90.   };
  91.  
  92. void ExitCommand()
  93. {
  94.   exit(-1);
  95. }
  96.  
  97. PopExit(parent, message)
  98. Widget parent;
  99. char *message;
  100. {
  101.   Widget shell, frame, labelwid, stringlabelwid;
  102.   WidgetClass wclass;
  103.   static String namestring;
  104.   Arg        args[5];
  105.   Position    x, y;
  106.   Dimension    width, height;
  107.   Cardinal    n;
  108.  
  109.   shell = XtCreatePopupShell("exitpopup", applicationShellWidgetClass,
  110.                  parent, NULL, ZERO);
  111.   frame = XtCreateManagedWidget("exitpopupform", formWidgetClass,
  112.                 shell, NULL, ZERO);
  113.  
  114.   labelwid = MakeLabel(frame, "exitlabel", message, NULL, NULL);
  115.  
  116.   MakeCommandButton(frame, "Ok", ExitCommand, labelwid, NULL, NULL);
  117.  
  118.   n = 0;
  119.   XtSetArg(args[n], XtNx, 100); n++;
  120.   XtSetArg(args[n], XtNy, 100); n++;
  121.   XtSetArg(args[n], XtNtitle, "XWAIS Question Error"); n++;
  122.   XtSetValues(shell, args, n);
  123.  
  124.   XtPopup(shell, XtGrabExclusive);
  125. }
  126.  
  127.  
  128. static time_t usersourcetime, commonsourcetime, questiontime;
  129. static int rescanint;
  130.  
  131. void ScanDirs(closure, id)
  132.      Opaque closure;
  133.      XtIntervalId *id;
  134. {
  135.   char **list_data;
  136.   float top, shown;
  137.   int CurrentQuestion, CurrentSource, i;
  138.   struct stat buf;
  139.   boolean rescan;
  140.   char string[STRINGSIZE];
  141.  
  142.   rescan = FALSE;
  143.  
  144.   stat(app_resources.userSourceDirectory, &buf);
  145.  
  146.   if(buf.st_mtime != usersourcetime) {
  147.     usersourcetime = buf.st_mtime;
  148.     rescan = TRUE;
  149.   }
  150.  
  151.   if(app_resources.commonSourceDirectory[0] != 0) {
  152.     stat(app_resources.commonSourceDirectory, &buf);
  153.  
  154.     if(buf.st_mtime != commonsourcetime) {
  155.       commonsourcetime = buf.st_mtime;
  156.       rescan = TRUE;
  157.     }
  158.   }
  159.  
  160.   if (rescan) {
  161.     rescan = FALSE;
  162.  
  163.     CurrentSource = get_selected_source();
  164.     if (CurrentSource != NO_ITEM_SELECTED)
  165.       strcpy(string, Source_items[CurrentSource]);
  166.  
  167.     NumSources = 0;
  168.  
  169.     GetSourceNames(app_resources.userSourceDirectory);
  170.     if(app_resources.commonSourceDirectory[0] != 0)
  171.       GetSourceNames(app_resources.commonSourceDirectory);
  172.  
  173.     RebuildListWidget(sourcewindow, Source_items);
  174.  
  175.     if(CurrentSource != NO_ITEM_SELECTED) {
  176.       for(i = 0;
  177.       Source_items[i] != NULL && 
  178.       strcmp(Source_items[i], string) != 0;
  179.       i++);
  180.       if(i < NumSources) XawListHighlight(sourcewindow->ListWidget, i);
  181.     }
  182.   }
  183.  
  184.   rescantimerid = XtAddTimeOut(rescanint, ScanDirs, (Opaque) ScanDirs);
  185. }
  186.  
  187. /* this will take as its argument the name of a question file,
  188.    and will do all the right things with it.
  189. */
  190.  
  191.  
  192. char *log_file_name = NULL;
  193. FILE *logfile = NULL;
  194.  
  195. void
  196. main(argc, argv)
  197.      int argc;
  198.      char *argv[];
  199. {
  200.   struct stat buf;
  201.   long count;
  202.   Widget frame, labelwid, stringlabelwid, button;
  203.   WidgetClass wclass;
  204.   static String
  205.     name = "";
  206.   Arg arglist[10];
  207.   Cardinal num_args;
  208.   static String items[] = {NULL};
  209.   int n;
  210.   float shown;
  211.   Question question;
  212.   char msg[STRINGSIZE];
  213.  
  214.   Type_items = (char**)s_malloc(20*sizeof(char*));
  215.   Type_items[0] = NULL;
  216.  
  217.   if (command_name = (char*)rindex(argv[0], '/'))
  218.     command_name++;
  219.   else
  220.     command_name = argv[0];
  221.  
  222.   the_Source = (Source) s_malloc(sizeof(_Source));
  223.  
  224.   NumSources = 0;
  225.  
  226.   allText = NULL;
  227.  
  228.   double_click = FALSE;
  229.  
  230.   top = XtInitialize("xwais", "Xwais", NULL, 0, &argc, argv);
  231.   
  232.   XtAddActions(xwaisActionsTable, XtNumber(xwaisActionsTable));
  233.  
  234.   XtGetApplicationResources(top, &app_resources, resources,
  235.                 XtNumber(resources), NULL, 0);
  236.  
  237.   app_context = XtWidgetToApplicationContext(top);
  238.  
  239.   if (app_resources.defaultsInstalled == False) {
  240.     PopExit(top, "X resources not properly installed");
  241.     XtMainLoop();
  242.   }
  243.  
  244.   if(app_resources.documentDirectory[0] == '~') {
  245.     char *home, *dir, *getenv();
  246.     
  247.     if((home = getenv("HOME")) != NULL) {
  248.       if((dir = s_malloc(strlen(home) +
  249.                strlen(app_resources.documentDirectory) +
  250.                2)) == NULL) {
  251.     fprintf(stderr, "Ran out of space trying to create directory name.\n");
  252.     exit(-1);
  253.       }
  254.       strcpy(dir, home);
  255.       strcat(dir, &app_resources.documentDirectory[1]);
  256.       app_resources.documentDirectory=dir;
  257.     }
  258.   }
  259.  
  260.   if(app_resources.userSourceDirectory[0] == '~') {
  261.     char *home, *dir, *getenv();
  262.     
  263.     if((home = getenv("HOME")) != NULL) {
  264.       if((dir = s_malloc(strlen(home) +
  265.                strlen(app_resources.userSourceDirectory) +
  266.                2)) == NULL) {
  267.     fprintf(stderr, "Ran out of space trying to create directory name.\n");
  268.     exit(-1);
  269.       }
  270.       strcpy(dir, home);
  271.       strcat(dir, &app_resources.userSourceDirectory[1]);
  272.       app_resources.userSourceDirectory=dir;
  273.     }
  274.   }
  275.   sdir = app_resources.userSourceDirectory;
  276.   cdir = app_resources.commonSourceDirectory;
  277.  
  278.   stat(app_resources.userSourceDirectory, &buf);
  279.   usersourcetime = buf.st_mtime;
  280.   GetSourceNames(app_resources.userSourceDirectory);
  281.  
  282.   if(app_resources.commonSourceDirectory[0] != 0) {
  283.     stat(app_resources.commonSourceDirectory, &buf);
  284.     commonsourcetime = buf.st_mtime;
  285.     GetSourceNames(app_resources.commonSourceDirectory);
  286.   }
  287.  
  288.   if(app_resources.questionDirectory[0] == '~') {
  289.     char *home, *dir, *getenv();
  290.     
  291.     if((home = getenv("HOME")) != NULL) {
  292.       if((dir = s_malloc(strlen(home) +
  293.                strlen(app_resources.questionDirectory) +
  294.                2)) == NULL) {
  295.     fprintf(stderr, "Ran out of space trying to create directory name.\n");
  296.     exit(-1);
  297.       }
  298.       strcpy(dir, home);
  299.       strcat(dir, &app_resources.questionDirectory[1]);
  300.       app_resources.questionDirectory=dir;
  301.     }
  302.   }
  303.   /* let's see if it exists, if not, try to create it */
  304.   {
  305.     DIR *dirp;
  306.     char *makedir;
  307.  
  308.     if((dirp = opendir(app_resources.questionDirectory)) == NULL) {
  309.       if((makedir = s_malloc(strlen(app_resources.questionDirectory) + 12))
  310.      == NULL) {
  311.     fprintf(stderr, "Ran out of space trying to create directory name.\n");
  312.     exit(-1);
  313.       }
  314.       strcpy(makedir, "/bin/mkdir ");
  315.       strcat(makedir, app_resources.questionDirectory);
  316.       if(makedir[strlen(makedir)-1] == '/') makedir[strlen(makedir)-1] = 0;
  317.       if(system(makedir) != 0)
  318.     fprintf(stderr, "Error creating directory: %s\n",
  319.         app_resources.questionDirectory);
  320.     }
  321.     else
  322.       closedir(dirp);
  323.  
  324.     if((dirp = opendir(app_resources.userSourceDirectory)) == NULL) {
  325.       if((makedir = s_malloc(strlen(app_resources.userSourceDirectory) + 12))
  326.      == NULL) {
  327.     fprintf(stderr, "Ran out of space trying to create directory name.\n");
  328.     exit(-1);
  329.       }
  330.       strcpy(makedir, "/bin/mkdir ");
  331.       strcat(makedir, app_resources.userSourceDirectory);
  332.       if(makedir[strlen(makedir)-1] == '/') makedir[strlen(makedir)-1] = 0;
  333.       if(system(makedir) != 0)
  334.     fprintf(stderr, "Error creating directory: %s\n",
  335.         app_resources.userSourceDirectory);
  336.     }
  337.     else
  338.       closedir(dirp);
  339.  
  340.     if((dirp = opendir(app_resources.documentDirectory)) == NULL) {
  341.       if((makedir = s_malloc(strlen(app_resources.documentDirectory) + 12))
  342.      == NULL) {
  343.     fprintf(stderr, "Ran out of space trying to create directory name.\n");
  344.     exit(-1);
  345.       }
  346.       strcpy(makedir, "/bin/mkdir ");
  347.       strcat(makedir, app_resources.documentDirectory);
  348.       if(makedir[strlen(makedir)-1] == '/') makedir[strlen(makedir)-1] = 0;
  349.       if(system(makedir) != 0)
  350.     fprintf(stderr, "Error creating directory: %s\n",
  351.         app_resources.documentDirectory);
  352.     }
  353.     else
  354.       closedir(dirp);
  355.   }
  356.   
  357.   {
  358.     char qfilename[256];
  359.     FILE *fp;
  360.  
  361.     if (argc == 1) /* we have no quesiton specified.  Let's just make a new one */
  362.       {
  363.     the_Question = (XQuestion)s_malloc(sizeof(_XQuestion));
  364.     the_Question->q = (Question)s_malloc(sizeof(_Question));
  365.     if(app_resources.questionName[0] != 0)
  366.       strcpy(the_Question->q->name, app_resources.questionName);
  367.     else
  368.       strcpy(the_Question->q->name, "New Question");
  369.       }
  370.     else if (argc == 2)
  371.       {
  372.     sprintf(qfilename, "%s%s", app_resources.questionDirectory, argv[1]);
  373.  
  374.     if((fp = fopen(qfilename, "r")) == NULL) {
  375.       fprintf(stderr, "Can't open question %s\n", qfilename);
  376.       exit(-1);
  377.     }
  378.  
  379.     the_Question = (XQuestion)s_malloc(sizeof(_XQuestion));
  380.     the_Question->q = (Question)s_malloc(sizeof(_Question));
  381.     strcpy(the_Question->q->name, argv[1]);
  382.  
  383.     ReadQuestion(the_Question->q, fp);
  384.     fclose(fp);
  385.       }
  386.     else
  387.       {
  388.     fprintf(stderr, "usage: %s [Question_file_name]", argv[0]);
  389.     exit(0);
  390.       }
  391.   }
  392.  
  393.   if (app_resources.seedWords[0] != 0
  394.       && the_Question->q->keywords[0] == 0)
  395.     strcpy(the_Question->q->keywords, app_resources.seedWords);
  396.  
  397.   if (app_resources.initialSource[0] != 0
  398.       && the_Question->q->Sources == NULL) {
  399.     the_Question->q->Sources = makeSourceList((SourceID)s_malloc(sizeof(_SourceID)),
  400.                        NULL);
  401.     the_Question->q->Sources->thisSource->filename = s_strdup(app_resources.initialSource);
  402.   }    
  403.  
  404.   maxDocs = app_resources.maximumResults;
  405.  
  406.   CurDpy = XtDisplay(top);
  407.  
  408.   MakeQuestionForm(the_Question);
  409.  
  410.   sourcepopup = (Widget) MakeSourcePopup(top);
  411.  
  412.   messwidget = the_Question->window->StatusWindow;
  413.  
  414.   GetSourceNames(app_resources.userSourceDirectory);
  415.   if(app_resources.commonSourceDirectory[0] != 0)
  416.     GetSourceNames(app_resources.commonSourceDirectory);
  417.  
  418.   /* and away we go! */
  419.  
  420.   question = the_Question->q;
  421.  
  422.   sprintf(msg, "X WAIS Question: %s",  question->name);
  423.  
  424.   num_args = 0;
  425.   XtSetArg(arglist[num_args], XtNtitle, msg); num_args++;
  426.   XtSetArg(arglist[num_args], XtNiconName, question->name); num_args++;
  427.   XtSetValues(top, arglist, num_args);
  428.  
  429.   question->modified = TRUE;
  430.  
  431.   sourcewindow = (ScrollList)MakeSourceFrame(top);
  432.   typewindow = (ScrollList)MakeTypeFrame(top);
  433.  
  434.   XtRealizeWidget(top);
  435.  
  436.   /* do all  the necessary stuff */
  437.  
  438.   the_Question->Source_Items =
  439.     buildSourceItemList(question->Sources);
  440.  
  441.   RebuildListWidget(the_Question->window->Sources, the_Question->Source_Items);
  442.   RebuildListWidget(sourcewindow, Source_items);
  443.  
  444.   question->numsources = charlistlength(the_Question->Source_Items);
  445.  
  446.   the_Question->Relevant_Items =
  447.     buildDocumentItemList(question->RelevantDocuments, FALSE);
  448.  
  449.   RebuildListWidget(the_Question->window->RelevantDocuments,
  450.             the_Question->Relevant_Items);
  451.  
  452.   question->numdocs = charlistlength(the_Question->Relevant_Items);
  453.  
  454.   the_Question->Result_Items =
  455.     buildDocumentItemList(question->ResultDocuments, TRUE);
  456.  
  457.   RebuildListWidget(the_Question->window->ResultDocuments,
  458.             the_Question->Result_Items);
  459.  
  460.   question->numresdocs = charlistlength(the_Question->Result_Items);
  461.  
  462.   if(app_resources.doSearch != False) DoSearch(NULL, NULL, NULL);
  463.  
  464.   rescanint = 1000 * atoi(app_resources.rescanInterval);
  465.  
  466.   rescantimerid = XtAddTimeOut(rescanint, ScanDirs, (Opaque) ScanDirs);
  467.  
  468.   /*freopen("/dev/null", "a", stderr);*/
  469.  
  470.   MakeWaisCursors();
  471.   unfuzzButtons();
  472.  
  473.   XtSetArg(arglist[0], XtNsensitive, False);
  474.   XtSetValues(viewbutton, arglist, ONE);
  475.   XtSetValues(saveAsButton, arglist, ONE);
  476.  
  477.   XtMainLoop();
  478. }
  479.  
  480.